package ig.finanzas;

import ig.finanzas.riesgo.FactorRiesgoPersonal;
import ig.util.excepciones.DatoInvalidoExcepcion;
import ig.util.excepciones.LogicaExcepcion;
import java.rmi.RemoteException;
import java.util.Date;
import javax.ejb.FinderException;

/**
 * Define los metodos que se pueden operar sobre los objetos tipo ContratoSimple registrados en el sistema. Un ContratoSimple hace referencia a un contrato que  no puede ser atomizable o desmaterializable y que no maneja valores registrados.
 * @author  lfgarcia
 */
public interface ContratoSimple extends Contrato {

	public static final String TIPO_NEGOCIABLE = "NEGOCIABLE";
	public static final String TIPO_DISPONIBLEVENTA = "DISPONIBLEVENTA";
	
	/**
	 * Devuelve el nombre del contrato.
	 * @return
	 * @throws RemoteException
	 * @uml.property  name="nombre"
	 */
	public String getNombre() throws RemoteException;
	
	/**
	 * Devuelve el tipo de contrato. Los valores validos son Disponible para la Venta y  negociables.
	 * @return
	 * @throws RemoteException
	 * @uml.property  name="tipo"
	 */
	public String getTipo() throws RemoteException;
	
	/**
	 * A partir de los flujos futuros a partir de la fecha especificada calcula como quedarian los
	 * flujos utiles para el calculo de la duracion. La constitucion de los flujos se hace de acuerdo
	 * a la norma que dicta la Super Intendencia Bancaria para tal fin. 
	 * @param fecha
	 * @return
	 * @throws LogicaExcepcion Si el contrato no tiene flujos para efectuar la operacion.
	 * @throws DatoInvalidoExcepcion Si la fecha especificada es nula.
	 * @throws RemoteException
	 */
	public ManejadorFlujos flujosParaDuracion(Date fecha) throws LogicaExcepcion, DatoInvalidoExcepcion, RemoteException;
	
	/**
	 * Calcula el valor en riesgo del contrato.
	 * @param fecha
	 * @param numdias Este parametro solo se utiliza cuando como tasa de referencia se utiliza la curva cero cupon
	 * exclusivamente para el calculo de la volatilidad de la misma. 
	 * @param factor
	 * @return
	 * @throws DatoInvalidoExcepcion Si la fecha o el factor especificado son nulos, o si el factor de riesgo definido
	 * no es de tipo tasa, o si el valor de la tasa en esa fecha es menor o igual a -1.
	 * @throws LogicaExcepcion Si el contrato no tiene flujos, 
	 * o si no se puede determinar el valor de la tasa en dicha fecha.
	 * @throws FinderException Si no se puede cargar la tasa de descuento.
	 * @throws RemoteException
	 */
	public double valorEnRiesgo(Date fecha, int numdias, FactorRiesgoPersonal factor) 
	throws DatoInvalidoExcepcion, LogicaExcepcion, FinderException, RemoteException;
	
}
